package lx7;
 /*
            有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为 {10,5,20,50,100,200,500,800,2,80,300,700};
            创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”，“抽奖箱2”
            随机从抽奖池中获取奖项元素并打印在控制台上,格式如下:
            每次抽的过程中，不打印，抽完时一次性打印(随机)    在此次抽奖过程中，抽奖箱1总共产生了6个奖项。
                分别为：10,20,100,500,2,300最高奖项为300元，总计额为932元
            在此次抽奖过程中，抽奖箱2总共产生了6个奖项。
                分别为：5,50,200,800,80,700最高奖项为800元，总计额为1835元
        */

import java.util.ArrayList;
import java.util.Collections;

public class MyThread extends Thread {
    //共享数据
    // 奖励的金额
    ArrayList<Integer> list;

    public MyThread(ArrayList<Integer> list) {
        this.list = list;
    }


/*
我们采用随机抽一个删一个的方法
 */

    @Override
    public void run() {
        //创建集合 存放抽奖的奖项 这些集合都是根据线程的创建而创建的 就是每个线程创建一个集合
        ArrayList<Integer> boxList = new ArrayList<>();
        //1.循环
        while (true) {

            //同步代码块
            synchronized (MyThread.class) {
                //判断共享数据是否到了末尾（到了末尾）

                if (list.size() == 0) {
                    break;
                } else {
                    //判断共享数据是否到了末尾（还没有到末尾）
                    //随机一个删一个
                    Collections.shuffle(list);
                    int index = list.get(0);
                    list.remove(0);
                    //每个线程对对应的集合添加元素（集合不同）
                    boxList.add(index);

                }

            }
            /*
            把sleep代码写在锁的外面
            因为当线程1进去了，如果你sleep写在锁里面，导致线程1睡了，线程2就无法进入锁了。
            写在外面，线程1执行完了，锁就开了，线程1睡100ms 线程2就有机会抢到cpu执行权
             */
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        int sum = 0;
        int max = 0;
        for (Integer i : boxList) {
            sum += i;
            if (max < i) {

                max = i;
            }

        }
        //这里看起来只是打印一个集合，本质上是根据线程的多少打印出不同的集合
        System.out.println(getName() + boxList + "最高奖项为" + max + "元，总计额为" + sum + "元");


    }


}
